// src/stores/store.js
// 这是一个 Pinia Store 的定义文件，用于管理应用的状态。
// Pinia 是 Vue 3 推荐的状态管理库，它更轻量、更易用。

import { defineStore } from 'pinia';

/**
 * @function useHealthAtlasStore
 * @description 定义并导出一个名为 'healthAtlas' 的 Pinia Store。
 * 小白话：这个就像一个大的“数据仓库”，里面存放着我们应用里需要共享的数据（state）
 * 和操作这些数据的方法（actions）。
 */
export const useHealthAtlasStore = defineStore('healthAtlas', {
  /**
   * @property state
   * @description 定义 Store 的状态（数据）。
   * 小白话：这里就是数据仓库里具体存放的数据，比如用户的健康分数、中医体质等。
   * 这些数据是响应式的，当它们改变时，使用它们的地方会自动更新。
   */
  state: () => ({
    userInfo: {
      name: '默认用户',
      avatar: '',
      healthScore: 0,
      tcmStatus: ''
    },
    // 可以在这里添加更多全局状态，例如：
    // isAuthenticated: false,
    // notifications: [],
  }),

  /**
   * @property getters
   * @description 定义 Store 的计算属性。
   * 小白话：Getters 就像数据仓库里的“查询员”，它们可以根据现有的数据计算出新的数据，
   * 但不会改变原始数据。比如，可以计算用户的健康等级。
   */
  getters: {
    // 示例：根据健康分数判断健康等级
    healthLevel: (state) => {
      if (state.userInfo.healthScore >= 90) return '优秀';
      if (state.userInfo.healthScore >= 70) return '良好';
      return '一般';
    },
  },

  /**
   * @property actions
   * @description 定义 Store 的操作方法。
   * 小白话：Actions 就像数据仓库里的“操作员”，它们可以修改数据（state），
   * 也可以执行一些异步操作（比如从服务器获取数据）。
   */
  actions: {
    /**
     * @function updateUserInfo
     * @param {Object} newInfo - 包含要更新的用户信息的新对象。
     * @description 更新用户的基本信息。
     * 小白话：这个方法用来更新用户的数据，比如用户登录后，我们可以调用它来更新用户的姓名和头像。
     */
    updateUserInfo(newInfo) {
      this.userInfo = { ...this.userInfo, ...newInfo };
    },

    /**
     * @function fetchUserInfo
     * @description 模拟从后端获取用户信息的异步操作。
     * 小白话：这个方法模拟从网络上获取用户数据，因为网络请求需要时间，所以这是一个异步操作。
     * 实际项目中，这里会调用 API 接口。
     */
    async fetchUserInfo() {
      // 模拟异步请求
      return new Promise(resolve => {
        setTimeout(() => {
          const fetchedInfo = {
            name: '张医生',
            avatar: 'src/assets/user.jpg', // 假设这是从后端获取的头像路径
            healthScore: 92,
            tcmStatus: '气血平和'
          };
          this.updateUserInfo(fetchedInfo);
          resolve(fetchedInfo);
        }, 1000);
      });
    },
  },
});